package com.base.array;

/**
 * 794. 有效的井字游戏
 *
 * @author leon
 * @date 2021年12月09日 20:44
 */
public class ValidTicTacToe {
    // board是个3*3的

    /**
     * 1,判断是否是轮流放入,('O'与'X'个数相差小于2) 计数
     * 2,是否两个都有3个连成一排  横  竖 斜线? 如果达成,直接返回false
     * 2,是否满足推出条件? 所有位置非空,或者有3个连成线.. 当满足条件后,就没法在插入了,如果在插入,就不是有效的井游戏
     *
     * @param board
     * @return
     */
    public boolean validTicTacToe(String[] board) {
        int n = board.length;
        if (n != 3) {
            return false;
        }
        // 分别存储两种标记的个数
        int O = 0, X = 0;
        boolean b1 = false, b2 = false;
        for (int i = 0; i < n; i++) {
            int m = board[i].length();
            if (m != 3) {
                return false;
            }
            String s = board[i];
            for (int j = 0; j < m; j++) {
                char cur = s.charAt(j);
                if (cur == 'O') {
                    O++;
                    if(exit(i, j, board))
                        b1 = true;
                } else if (cur == 'X') {
                    X++;
                    if (exit(i, j, board))
                        b2 = true;
                }


            }
        }
        //        1、X必须比O多1个或者相同，否则false；
        //        2、X和O不能同时都是赢家，否则false；
        //        3、X赢的时候必须比O多1个，否则false；
        //        4、O赢得时候个数与X相同，否则false；
        if (O > X || X - O > 1) {
            return false;
        }


        if(b1&&b2){
            return false;
        }else if(b1){
            if(!(X==O))
                return false;
        }else if (b2){
            if(!(X==O+1)){
                return false;
            }

        }


        return true;

    }

    // 判断当前位置的元素是否满足退出条件
    public boolean exit(int i, int j, String[] board) {
        char cur = board[i].charAt(j);
        if (i == 2) {
            if (cur == board[0].charAt(j) && cur == board[1].charAt(j)) {
                return true;
            }
        }

        if (i == 2 && j == 0) {
            if (board[0].charAt(2) == board[1].charAt(1) && board[2].charAt(0) == board[1].charAt(1)) {
                return true;
            }

        }

        if (j == 2) {
            if (cur == board[i].charAt(0) && cur == board[i].charAt(1)) {
                return true;
            }
        }

        if (j == 2 && i == 2) {
            if (cur == board[0].charAt(0) && cur == board[1].charAt(1)) {
                return true;
            }
        }
        return false;


    }

    public static void main(String[] args) {
        System.out.println(new ValidTicTacToe().validTicTacToe(new String[]{"XXX","X O","OOO"}));

    }

}
